CodeCommit を使用したユーザーの人数分よりも多く課金された場合の対処方法
困っている内容
CodeCommit は 1 ユーザーにつき 1 度でも使用したら、その後は何度使っても、使用した月中は 1 USD のみ課金されると認識しているのですが、今月 1 人しか使用していないのに 2 USD 課金されていました。
CloudTrail で履歴を見てみましたが、やはり 1 人しか使用していませんでした。
1 人しか使用していなくても、2 人分課金されるケースはあるのでしょうか。
どう対応すればいいの?
CodeCommit では、固有の AWS Identity ごと、つまり CloudTrail に記録される userIdentity.arn の値ごとにアクティブユーザーとしてカウントされ、アクティブユーザー 1 人につき 1 USD/月課金されます。[1][2]
アクティブユーザーとは、その月に Git リクエストにより、または AWS マネジメントコンソール、AWS CLI、AWS SDK を使用して AWS CodeCommit リポジトリにアクセスする、すべての固有の AWS Identity (IAM ユーザー/ロール、フェデレーティッドユーザー、ルートアカウント) を指します。アクティブユーザーとしてカウントされるのは、AWS Identity が他の AWS のサービスの使用によって作成される場合です。これには、AWS CodeBuild や AWS CodePipeline、固有の AWS Identity を使用して CodeCommit にアクセスするサーバーなどが含まれます。
Q: AWS CodeCommit にはどのくらいの費用がかかりますか?
AWS CodeCommit の費用は、アクティブなユーザー 1 人につき 1 USD/月です。
例えば以下に記載されている IAM ユーザーは CodeCommit_ActiveUser の 1 人ですが、userIdentity.arn の値が異なる為、アクティブユーザーは 2 人としてカウントされ 2 USD 課金されます。
# 1 人目 "userIdentity": { ~~~ "arn": "arn:aws:iam::<アカウントID>:user/CodeCommit_ActiveUser", ~~~ # 2 人目 "userIdentity": { ~~~ "arn": "arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/CodeCommit_ActiveUser", ~~~
その為、CloudTrail で CodeCommit に対して複数の userIdentity.arn からアクセスしていないか確認してください。
もし意図しない userIdentity.arn からのアクセスがある場合は、CodeCommit へのアクセスを特定の userIdentity.arn に絞ることで想定外の課金を防げます。
マネジメントコンソールにおける CodeCommit 操作時の補足
マネジメントコンソールで CodeCommit を操作する場合、リポジトリの詳細まで開くとアクティブユーザーとしてカウントされます。
マネジメントコンソールにおける CodeCommit 操作時、どのタイミングでアクティブユーザーとしてカウントされるか検証した結果、リポジトリ一覧の表示までは ListRepositories と BatchGetRepositories という API コールが実行されていましたが、アクティブユーザーとしてはカウントされませんでした。
しかし、リポジトリの詳細を開くと GetObjectIdentifier 等の API コールが実行され、これによりアクティブユーザーとしてカウントされました。
AWS CLI における CodeCommit 操作時の補足
AWS CLI コマンド実行時にプロファイルの設定から自動で AssumeRole すると、CloudTrail にbotocore-session-1234567890
のようなロールセッション名が記録されます。
"userIdentity": { ~~~ "arn": "arn:aws:sts::<アカウントID>:assumed-role/<ロール名>/botocore-session-1234567890", ~~~
末尾の数字は現在の UNIX 時間が割り当てられる為[3]、一時的な認証情報の有効期限が切れた後再度 AssumeRole すると、CodeCommit では別のアクティブユーザーとしてカウントされ、課金の対象となります。
上記による課金を防ぎたい場合は、AWS CLI の~/.aws/config
に記述のプロファイル情報にて、role_session_name
を使用して明示的にロールセッション名を指定してください。
これによって、AWS CLI による AssumeRole の際に指定したロールセッション名が使用されるようになります。
role_session_name
の詳細や設定方法については、[4][5]が参考になると思います。
参考資料
[1] 料金 - Amazon CodeCommit
[2] よくある質問 - Amazon CodeCommit
[3] botocore/credentials.py
[4] AWS CLI Configuration Variables — AWS CLI 2.8.0 Command Reference
[5] AWS CLIがAssumeRoleする際のセッション名を指定する